from app.extensions import db

from .post import Post


class User(db.Model):
    __tablename__='users'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(32),nullable=False,unique=True)
    password_hash = db.Column(db.String(128),nullable=False)
    email = db.Column(db.String(64),nullable=False,unique=True)
    #是否激活
    confirm = db.Column(db.Boolean,default=False)
    # 头像
    icon = db.Column(db.String(64), default='default.jpg')
    # 在另一模型中添加一个反向引用
    # 参数1：关联的模型名
    # backref：在关联的模型中动态添加的字段
    # 加载方式：dynamic，不加载，但是提供记录的查询
    # 若使用一对一，添加uselist=Flase
    posts = db.relationship('Post', backref='user', lazy=True)

    # 收藏
    # secondary：指定关系表
    favorites = db.relationship('Post', secondary='collections',
                                backref=db.backref('users', lazy='dynamic'),
                                lazy='dynamic')
    # focus = db.relationship('User', secondary='focus',
    #                             backref=db.backref('focusid', lazy='dynamic'),
    #                             lazy='dynamic')
    #

    def __repr__(self):
        return self.username

    # 密码字段保护
    @property
    def password(self):
        raise AttributeError('密码是不可读属性')

    # 设置密码，加密存储
    @password.setter
    def password(self, password):
        # 相当于执行  user.password_hash=password
        # self.password_hash = generate_password_hash(password)
        pass

    # 密码的校验
    def verify_password(self, password):
        # return check_password_hash(self.password_hash, password)
        pass

    # 判断是否收藏
    def is_favorites(self,pid):
        #获取微博对象
        post = Post.query.get(pid)
        #判断微博是否在用户收藏列表中
        if post in self.favorites:
            #说明已经收藏
            return True
        else:
            return False

    # 收藏指定帖子
    def add_favorite(self, pid):
        p = Post.query.get(pid)
        self.favorites.append(p)

    # 取消收藏指定帖子
    def cancel_favorite(self, pid):
        p = Post.query.get(pid)
        self.favorites.remove(p)

